package com.neusoft.nep.SystemAdminstrator.Common;

import com.neusoft.nep.SystemAdminstrator.entity.SystemUser;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FileUtills {
    public static Map readMapObject(String filename){
        File file = new File(filename);
        Map map = null;
        try{
            //再读取数据之前，判断一下文件内容是否为空
            if (file.length() == 0){
                map = new HashMap<>();
            }else {
                //用户注册的时候，先把之前注册的用户List读取出来
                //先构建一个文件输入流
                //再构建一个对象输入流
                FileInputStream fis = new FileInputStream(file);
                ObjectInputStream ois = new ObjectInputStream(fis);
                //文件输入流会吧东西全读出来，而对象输入流则吧所有数据都转化成对象，而readobject这个方法，
                //一次只能按顺序读出来一个对象，只是这个项目中我们是吧所有用户都存在一个map表里面，
                //所以实际上文件中之存了一个Map类型的map对象，因此只用了一次readOject读取这唯一的一个map对象
                map = (Map) ois.readObject();
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return map;
    }

    public static void writeMapObject(String  filename, Map map) throws IOException {
        try{
            File file = new File(filename);
            if(!file.exists()){//如果文件不存在，则创建一个新文件
                file.createNewFile();
            }
            //构建一个文件输出流
            FileOutputStream fos = new FileOutputStream(file);
            //构建一个对象输出流
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //使用oos写入对象
            oos.writeObject(map);
            //用于收尾，防泄漏的小函数
            oos.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static <T> List<T> readListObject(String fileName) {
        List<T> list = null;
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName))) {
            list = (List<T>) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return list;
    }

    public static <T> void writeListObject(String fileName, List<T> list) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
            oos.writeObject(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void createFileIfNotExists(String filename) {
        File file = new File(filename);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
